package com.whmall.service.crm.api;

import com.whmall.component.entity.dto.*;
import com.whmall.component.service.ChainQueryService;
import com.whmall.component.service.QueryService;
import com.whmall.component.service.SaveService;
import com.whmall.service.crm.entity.dto.company.*;
import com.whmall.service.crm.entity.dto.company.graph.CompanyGraphDataReqDTO;
import com.whmall.service.crm.entity.dto.company.graph.CompanyGraphDataRspDTO;
import com.whmall.service.crm.entity.dto.company.graph.node.CompanyGraphNode;

import java.util.List;
import java.util.Map;

/**
 * 公司API
 *
 * @Author xiangzhou
 * @Date 2020-07-16 13:24
 */
public interface CompanyApi extends QueryService, ChainQueryService<CompanyQueryCondition>, SaveService {

    /**
     * 查询公司图数据信息
     *
     * @param id      公司ID
     * @param request 图数据请求
     * @return 公司图列表
     */
    CompanyGraphDataRspDTO findOrderDetailGraphDataById(Long id, CompanyGraphDataReqDTO request);

    /**
     * 查询公司图数据信息
     *
     * @param ids     公司ID列表
     * @param request 图数据请求
     * @return 公司图列表
     */
    List<CompanyGraphDataRspDTO> findOrderDetailGraphDataByIds(List<Long> ids, CompanyGraphDataReqDTO request);

    /**
     * 列表查询
     * @param reqDTO 查询条件
     */
    List<CompanyGraphNode> list(CompanyListByReqDTO reqDTO);

    /**
     * 新建公司
     *
     * @param companyAddReqDTO 创建公司数据DTO
     * @return 返回新创建公司ID
     */
    Long createCompany(CompanyAddReqDTO companyAddReqDTO);

    /**
     * 同步创建公司信息（直接赋值 无校验）
     * @param addReqDTO
     * @param operator
     * @return
     */
    Long syncCreateCompany(CompanySyncAddReqDTO addReqDTO,OperatorReqDTO operator);

    /**
     * 批量同步创建公司信息（直接赋值 无校验）
     * @param list
     * @param operator
     * @return
     */
    Map<String,Long> batchSyncCreateCompany(List<CompanySyncAddReqDTO> list,OperatorReqDTO operator);

    /**
     * 编辑公司
     *
     * @param companyAddReqDTO 编辑公司数据DTO
     * @param companyId        公司ID
     */
    void updateCompany(Long companyId, CompanyAddReqDTO companyAddReqDTO);

    /**
     * 编辑公司客户基本信息
     *
     * @param companyId
     * @param companyAddReqDTO
     */
    void updateCompanyBasic(Long companyId, CompanyAddReqDTO companyAddReqDTO);

    /**
     * 更新公司企业类型 企业/非企业
     *
     * @param companyUpdateEnterpriseTypeReqDTO
     * @param operatorReqDTO
     */
    void updateCompanyEnterpriseType(CompanyUpdateEnterpriseTypeReqDTO companyUpdateEnterpriseTypeReqDTO, OperatorReqDTO operatorReqDTO);

    /**
     * 根据id查询公司
     *
     * @param companyId 公司ID
     */
    CompanyQueryRspDTO queryCompanyById(Long companyId);

    /**
     * 查询客户信息
     *
     * @param companyId
     * @return
     */
    CompanyQueryRspDTO queryCustomerInfo(Long companyId);

    /**
     * 根据id集合查询公司
     *
     * @param ids 公司ID的集合
     */
    List<CompanyRspDTO> queryCompanyByIds(List<Long> ids);

    /**
     * 根据ID集合查询公司（通用）
     *
     * @param ids
     * @return
     */
    Map<Long, CompanyKeyFieldDTO> listByIds(List<Long> ids);

    /**
     * 查询公司（通用）
     *
     * @param reqDTO
     * @return
     */
    List<CompanyKeyFieldDTO> listBy(CompanyListByReqDTO reqDTO);

    /**
     * 撮合id查询公司id
     *
     * @param id
     * @return
     */
    List<Long> listByTraderId(Long id);

    /**
     * 查询全部公司
     *
     * @return
     */
    Map<Long, CompanyKeyFieldDTO> listAll();

    /**
     * 注销公司
     *
     * @param reqDTO
     */
    void logout(CompanyLogoutReqDTO reqDTO);

    /**
     * 取消注销公司
     *
     * @param id
     * @param employeeId
     */
    void cancelLogout(Long id, Long employeeId);

    /**
     * 编辑供应商信息
     * <p>
     * param companyAddReqDTO
     * param companyId  公司ID
     */
    void updateSupplier(Long companyId, CompanyAddReqDTO companyAddReqDTO);

    /**
     * 编辑客户信息
     *
     * @param id     公司ID
     * @param reqDTO 客户信息
     */
    void updateCustomer(Long id, CompanyUpdateCustomerReqDTO reqDTO);

    /**
     * 批量修改
     *
     * @param reqDTO
     */
    void updateBatch(CompanyUpdateBatchReqDTO reqDTO);

    /**
     * 批量修改负责人
     *
     * @param reqDTO
     */
    List<CompanyManagerUpdateBatchRspDTO> updateManagerBatch(CompanyManagerUpdateBatchReqDTO reqDTO);

    /**
     * 修改负责人
     *
     * @param reqDTO
     */
    void updateManager(CompanyManagerUpdateReqDTO reqDTO);

    /**
     * 系统更新公司BD
     *
     * @param reqDTO
     */
    void updateBdBySystem(CompanyManagerUpdateReqDTO reqDTO);

    /**
     * 公司名是否存在
     *
     * @param id   公司ID
     * @param name 公司名称
     * @return 结果
     * @since 2021/8/25
     */
    Integer nameExists(Long id, String name);

    /**
     * 根据公司名称模糊查询公司
     *
     * @param name
     * @param companyAttribute 公司属性，1-客户，2-供应商，null-所有
     * @param limitNum         限制数据量，null表示不限制
     * @return
     */
    List<CompanyListByNameRspDTO> listByName(String name, Integer companyAttribute, Integer limitNum);

    /**
     * 根据公司名称查询公司
     *
     * @param name 公司名称
     * @return 公司
     */
    CompanyListByNameRspDTO getByName(String name);

    /**
     * 获取一个负责人
     * <br>平均分配原则
     *
     * @param targetPositionId 目标职位ID
     * @param isNewCustomer    是否新客户（新建公司/新建询盘且公司是新客户）
     * @param candidates       候选人列表
     * @return
     */
    Long getOneManager(Integer targetPositionId, Boolean isNewCustomer, Map<Object, Object> params, List<Long> candidates);

    /**
     * 修改时间（通用）
     *
     * @param reqDTO
     */
    void updateTime(CompanyUpdateTimeReqDTO reqDTO);

    /**
     * 员工部门路径修改后处理逻辑
     * <br/>修改公司表中相关的部门路径
     *
     * @param reqDTO
     */
    void employeeDepartmentPathChanged(EmployeeDepartmentPathChangedReqDTO reqDTO);

    /**
     * 查询公司（云检测定时任务）
     *
     * @return
     */
    Map<Integer, List<Long>> query4TestingOrderJobHandler();

    /**
     * 更新公司（云检测定时任务）
     *
     * @param reqDTO
     */
    void update4TestingOrderJobHandler(CompanyUpdate4TestingOrderJobHandlerReqDTO reqDTO);

    /**
     * 完善资料
     *
     * @param reqDTO
     */
    void fillData(CompanyFillDataReqDTO reqDTO);

    /**
     * 变更公司信息申请
     *
     * @param reqDTO
     */
    CompanyUpdateApplyDTO updateApply(CompanyUpdateApplyDTO reqDTO);

    /**
     * 更新公司易制毒企业ID
     *
     * @param id
     * @param precursorEnterpriseId
     */
    void updatePrecursorEnterpriseId(Long id, Long precursorEnterpriseId, OperatorReqDTO operatorReqDTO);

    /**
     * 根据公司id查询公司详细信息
     */
    CompanyInformationRspDTO informationById(Long id);

    /**
     * 根据公司ID查询公司详细信息
     *
     * <p>ids已检查</p>
     *
     * @param ids 所有ID
     * @return 公司详细信息
     * @author qiao shengda
     * @since 2021/6/15
     */
    List<CompanyInformationRspDTO> informationByIds(List<Long> ids);

    /**
     * 根据公司id查询该公司被哪些公司所关联
     * @return
     */
    List<CompanyInformationRspDTO> findAssociatedCompany(Long id);

    /**
     * 查询相互关联的公司
     * @param ids
     * @param queryAssociatedCompanyID
     * @return
     */
    List<CompanyInformationRspDTO> informationByIds(List<Long> ids, Long queryAssociatedCompanyID);

    /**
     * 更新公司信息
     *
     * @param companyInformation 公司信息
     * @since 2021/8/6
     */
    void updateCompanyInformation(CompanyInformationDTO companyInformation);

    /**
     * 分页查询公司日志
     *
     * @param pageReqDTO
     * @param reqDTO
     * @return
     */
    PageRspDTO<CompanyLogRspDTO> listCompanyLog(PageReqDTO pageReqDTO, CompanyLogListReqDTO reqDTO);

    /**
     * 创建公司日志
     *
     * @param createReqDTO
     */
    void createCompanyLog(CompanyLogCreateReqDTO createReqDTO);

    /**
     * 修改客户结算方式
     *
     * @param id
     * @param customerSettlementMethod
     * @param operatorReqDTO
     */
    void updateCustomerSettlementMethod(Long id, Integer customerSettlementMethod, OperatorReqDTO operatorReqDTO);

    /**
     * 修改供应商结算方式
     *
     * @param id
     * @param supplierSettlementMethod
     * @param operatorReqDTO
     */
    void updateSupplierSettlementMethod(Long id, Integer supplierSettlementMethod, OperatorReqDTO operatorReqDTO);

    /**
     * 根据易制毒企业ID查询全部公司
     *
     * @param precursorEnterpriseId 易制毒企业ID
     * @return 全部公司
     * @author Esion
     * @since 2021/11/15
     */
    List<CompanyKeyFieldDTO> listByPrecursorEnterpriseId(Long precursorEnterpriseId);


    /**
     * 流失客户分页查询
     *
     * @param pageReqDTO
     * @param reqDTO
     * @return
     */
    PageRspDTO<CompanyKeyFieldDTO> lostCustomerList(PageReqDTO pageReqDTO, LostCompanyListQueryReqDTO reqDTO);

    /**
     * 关联/取消关联  公司的关联公司
     *
     * @param reqDTO
     */
    void relevanceCompany(CompanyRelevanceCompanyReqDTO reqDTO);

    /**
     * 设置无开发价值/恢复开发价值
     *
     * @param reqDTO
     */
    void setNoDevelopmentValue(CompanyNoDevelopmentValueReqDTO reqDTO);

    /**
     * 根据撮合部门 路径查询公司
     *
     * @param departmentPath 撮合部门路径
     * @return 公司IDs
     */
    List<Long> listByTraderDepartment(String departmentPath);

    /**
     * 根据撮合部门 路径查询公司
     */
    List<Long> listByTraderDepartmentPath(String departmentPath);

    /**
     * 查询不存在公司类型的客户公司数据
     *
     * @return
     */
    List<CompanyNoTypeRspDTO> listNoCompanyTypeCustomerList();

    /**
     * 公司基本信息申请
     *
     * @return
     */
    Long companyBasicInfoApply(CompanyBasicInfoApplyDTO basicInfoApplyDTO, OperatorReqDTO operatorReqDTO);

    /**
     * 公司基本信息审核
     *
     * @param finishMessage
     */
    void companyBasicInfoAudit(ProcessInstanceCompletedMessageReqDTO finishMessage);

    /**
     * 更新锁定状态
     *
     * @param companyId 公司ID
     * @param operator  操作人
     */
    void updateLock(Long companyId, OperatorReqDTO operator);

    /**
     * 根据公司id查询对应的关联关系
     *
     * @param companyIdList
     * @return eg: 查询0001，0002 0003 关联公司信息 返回结果为 [[0001,0002,0004],[0002,0001],[0003]]
     * 0001,0002 互相关联 0003 没有关联公司
     * 返回的集合中是所有关联公司id 包括传入的公司id
     */
    List<List<Long>> getCompanyAssociatedList(List<Long> companyIdList);

    /**
     * 通过子公司获取父公司，产品约定父公司只会有一个
     *
     * @return key子公司，value父公司
     */
    Map<Long, Long> getAllParentCompany();

    /*
     * 采购信息查询公司id
     * @param purchaserId
     * @param purchaserDepartmentPath
     * @return
     */
    List<Long> listByPurchaserInfo(Long purchaserId, String purchaserDepartmentPath);


    /**
     * 分页查询在一段时间内注册的公司
     *
     * @param pageReqDTO 分页条件
     * @param condition  创建时间开始
     * @return 分页列表，只包含company信息
     */
    PageRspDTO<CompanyKeyFieldDTO> pageWithRegister(PageReqDTO pageReqDTO, CountWithRegisterReqDTO condition);

    /**
     * 统计在一段时间内注册的公司
     *
     * @param condition 创建时间开始
     * @return 数量
     */
    Long countWithRegister(CountWithRegisterReqDTO condition);

    /**
     * 修改是否能查看AI路线设免费版
     *
     * @param companyId  单位id
     * @param hasCvfvair
     */
    void updateCvfvairById(Long companyId, Integer hasCvfvair, OperatorReqDTO operator);


    /**
     * 通过ids 查询company是否存在共享锁
     *
     * @param ids
     * @return
     */
    List<Long> selectByIdsShareLock(List<Long> ids);

    /**
     * 设置客户账期黑名单列表
     * @param id
     * @param inBillingBlacklist
     * @param comment
     * @param operatorReqDTO
     */
    void setBillingBlackList(Long id, Integer inBillingBlacklist, String comment, OperatorReqDTO operatorReqDTO);

    /**
     * 修改客户专属采购
     */
    void updateCcp(Long id, UpdateCcpReqDto reqDto, OperatorReqDTO operatorReqDTO);

    /**
     * 获取订单交易主体
     */
    OrderTradingEntityRspDto getOrderTradingEntities(OrderTradingEntityReqDto reqDto);

}
